var Map = function() {
	this.bounds = {
		h: 0,
		w: 0,
		groundLevel: 160
	};

	this.coords = {
		x: 0,
		y: 0
	}

	// Flag indicates player can move free but background don't move
	this.isStep = false;

	this.sprites = {
		// Background
		background : {
			/*Propriétés de la portion de sprite à dessiner*/
			// Positions
			bgxm: 1524,		// Position X maximum
			bgy : 711,		// Position Y
			bgw : 1524,
			km	: 0.15,
			h 	: 88
		},
		// Double le background pour le faire boucler
		background_loop : {
			/*Propriétés de la portion de sprite à dessiner*/
			// Positions
			bgxm: 1524,		// Position X maximum
			bgy : 711,		// Position Y,
			bgw : 1524,
			ox  : 1524,
			km	: 0.15,
			h 	: 88
		},
		// Middleground
		middleground_2 : {
			/*Propriétés de la portion de sprite à dessiner*/
			// Positions
			bgxm: 3824,		// Position X maximum
			bgy : 476,		// Position Y
			oy  : 1.75,		// Offset Y
		},
		// Middleground
		middleground_1 : {
			/*Propriétés de la portion de sprite à dessiner*/
			// Positions
			bgxm: 3824,		// Position X maximum
			bgy : 237,		// Position Y
			oy  : 2,		// Offset Y
			// Animation
			km 	: 1.5,		// Nombre de stick avant d'animer
		},
		// Foreground
		foreground : {
			/*Propriétés de la portion de sprite à dessiner*/
			// Positions
			bgxm: 3824,		// Position X maximum
		}
	};

	this.setHeight = function(height) {
		this.bounds.h = height;
		// for (key in this.sprites) {
		// 	this.sprites[key].bgh = this.bounds.h;
		// }
		$('canvas').style.height = this.bounds.height;
	}

	this.setWidth = function(width) {
		this.bounds.w = width;
		// for (key in this.sprites) {
		// 	this.sprites[key].bgw = this.bounds.w;
		// }
		$('canvas').style.width = this.bounds.width;
	}

	this.setDefaultSprite = function() {
		this.defaultSprite = {
		/*Propriétés de la portion de sprite à dessiner*/
			// Dimensions
			bgh : this.bounds.h,		// Hauteur
			bgw : this.bounds.w,		// Largeur
			// Positions
			bgxsrc : 0,	// Position X d'origine
			bgx : 0,		// Position X actuelle
			bgxm: 0,		// Position X maximum
			bgy : 0,		// Position Y
			ox  : 0,		// Offset X
			oy  : 0,		// Offset Y
			// Animation
			k 	: 0,		// Index d'animation
			km 	: 1,		// Nombre de stick avant d'animer
			name : "desert"	// Nom du fichier
		}
	}

	this.init = function(height, width) {
		this.setHeight(height);
		this.setWidth(width);
		this.setDefaultSprite();

		// Merge sprites with default properties
		for(sprite in this.sprites) {
			this.sprites[sprite] = mergeObjects(this.sprites[sprite], this.defaultSprite);
		}

		this.sprites.foreground.km = player.speed;
	}

	this.update = function() {
		this.updateSprites();
	}

	this.updateSprites = function() {
		if(Math.abs(this.sprites.background.ox) > this.sprites.background_loop.ox + this.sprites.background_loop.bgxm) {
			this.sprites.background.ox = this.sprites.background_loop.ox + this.sprites.background_loop.bgxm;
		}

		if(Math.abs(this.sprites.background_loop.ox) > this.sprites.background.ox + this.sprites.background.bgxm) {
			this.sprites.background_loop.ox = this.sprites.background.ox + this.sprites.background.bgxm;
		}

		this.sprites.background.ox -= this.sprites.background.km;
		this.sprites.background_loop.ox -= this.sprites.background_loop.km;

		var x = Math.abs(player.coords.x);
		// Check if player reach end of the level
		if(this.sprites.foreground.bgx >= this.sprites.foreground.bgxm - this.sprites.foreground.bgw) {
			this.isStep = true;
		}

		// Move backgrounds according to player movement
		if (player.run === true && player.coords.dx === -1 && this.isStep === false) {
			if (x >= this.bounds.w/2 - player.bounds.w) {
				// Move Foreground sprite
				if (this.sprites.foreground.bgx < this.sprites.foreground.bgxm - this.sprites.foreground.bgw) {
					this.sprites.foreground.bgx += this.sprites.foreground.km;
					this.sprites.background.ox -= this.sprites.middleground_2.km/2;
					this.sprites.background_loop.ox -= this.sprites.middleground_2.km/2;
				}
				// Move middleground 1 
				if (this.sprites.middleground_1.bgx < x*this.sprites.middleground_1.km) {
					this.sprites.middleground_1.bgx += this.sprites.middleground_1.km;
				// Replace middleground 1 at origin
				} else {
					this.sprites.middleground_1.bgx = this.sprites.middleground_1.bgxsrc;
				}
				// Move middleground 2
				if (this.sprites.middleground_2.bgx < x*this.sprites.middleground_2.km) {
					this.sprites.middleground_2.bgx += this.sprites.middleground_2.km;
				// Replace middleground 2 at origin
				} else {
					this.sprites.middleground_2.bgx = this.sprites.middleground_2.bgxsrc;
				}
			}
		}
	}

	this.render = function(ctx) {
		drawRect(ctx, "#FFF", 0, 0, this.bounds.w, this.bounds.h);
		renderSprites(this);
	}
};